/**
 * 就这美 2017
 */
package com.xjoyt.pay.util;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
 * 
 * @版权：就这美 版权所有 (c) 2017
 * @ClassName:JSONUtil
 * @author liangzhm<br/>
 * @email liangzhm1985@foxmail.com
 * @version Revision 1.0.0
 * @since JDK 1.7
 * @创建日期：2017年5月13日下午4:59:05
 * @功能说明：
 * 
 */
public class JSONUtil {

	private static final Logger logger = Logger.getLogger(JSONUtil.class);

	/**
	 * JSON串构建map对象 jsonToMap
	 * 
	 * @author liangzhm
	 * @param jsonStr
	 * @param kClazz
	 * @param vClazz
	 * @return
	 * @创建日期：2017年5月13日下午5:09:12
	 */
	public static <K, V> Map<K, V> jsonToMap(String jsonStr, Class<K> kClazz, Class<V> vClazz) {
		if (StringUtils.isEmpty(jsonStr)) {
			return null;
		}
		Map<K, V> map = new HashMap<K, V>();
		try {
			JSONObject jsonObj = JSON.parseObject(jsonStr);
			Set<Entry<String, Object>> entrySet = jsonObj.entrySet();
			for (Entry<String, Object> entry : entrySet) {
				String key = entry.getKey();
				Object value = entry.getValue();
				map.put(ConvertUtil.convert(key, kClazz), ConvertUtil.convert(value, vClazz));
			}
		} catch (Exception e) {
			// logger.error("JSON转换失败，原因:" + ExceptionUtil.getStackTraceAsString(e));
		}
		return map;
	}

	/**
	 * JSON串构建map对象 jsonToMap
	 * 
	 * @author liangzhm
	 * @param jsonStr
	 * @param vClazz
	 * @return
	 * @创建日期：2017年5月13日下午5:09:43
	 */
	public static <V> Map<String, V> jsonToMap(String jsonStr, Class<V> vClazz) {
		return jsonToMap(jsonStr, String.class, vClazz);
	}

	/**
	 * JSON串构建map对象 jsonToMap
	 * 
	 * @author liangzhm
	 * @param jsonStr
	 * @return
	 * @创建日期：2017年5月14日上午11:26:12
	 */
	public static Map<String, String> jsonToMap(String jsonStr) {
		return jsonToMap(jsonStr, String.class, String.class);
	}

	/**
	 * 生成有序JSON串 mapToOrderJson
	 * 
	 * @author liangzhm
	 * @param data
	 * @param sortKeys
	 * @return
	 * @创建日期：2017年5月14日下午2:52:55
	 */
	public static String mapToOrderJson(Map<String, String> data, List<String> sortKeys) {
		JSONObject jsonObject = new JSONObject(sortKeys.size(), true);
		for (String key : sortKeys) {
			jsonObject.put(key, data.get(key));
		}
		return JSON.toJSONStringZ(jsonObject, SerializeConfig.getGlobalInstance(), SerializerFeature.QuoteFieldNames);
	}

	/**
	 * JSON转实体BEAN jsonToBean
	 * 
	 * @author liangzhm
	 * @param json
	 * @param clazz
	 * @return
	 * @创建日期：2017年5月16日上午10:09:05
	 */
	public static <T> T jsonToBean(String json, Class<T> clazz) {
		JSONObject jsonObject = JSON.parseObject(json);
		return JSON.toJavaObject(jsonObject, clazz);
	}

}
